{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2ea99bb5-8438-47f0-9981-7c39f1a5472c",
   "metadata": {},
   "source": [
    "### Generating Qiskit's data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "9e4a4ce2-594c-471f-8e07-37104cc94cb5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:31.183776Z",
     "iopub.status.busy": "2024-05-07T14:52:31.183379Z",
     "iopub.status.idle": "2024-05-07T14:52:33.080462Z",
     "shell.execute_reply": "2024-05-07T14:52:33.079783Z"
    }
   },
   "outputs": [],
   "source": [
    "from qiskit.utils import algorithm_globals\n",
    "from qiskit_machine_learning.datasets import ad_hoc_data\n",
    "\n",
    "seed = 12345\n",
    "algorithm_globals.random_seed = seed\n",
    "\n",
    "adhoc_dimension = 2\n",
    "train_features, train_labels, test_features, test_labels, adhoc_total = ad_hoc_data(\n",
    "    training_size=20,\n",
    "    test_size=5 + 5,  # 5 for test, 5 for predict\n",
    "    n=adhoc_dimension,\n",
    "    gap=0.3,\n",
    "    plot_data=False,\n",
    "    one_hot=False,\n",
    "    include_sample_total=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0890fcae-6002-4050-9351-9d8ce509821c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:33.083616Z",
     "iopub.status.busy": "2024-05-07T14:52:33.083062Z",
     "iopub.status.idle": "2024-05-07T14:52:33.087462Z",
     "shell.execute_reply": "2024-05-07T14:52:33.086879Z"
    }
   },
   "outputs": [],
   "source": [
    "# the `test_features` and `test_labels` are of size which is double that of the `test_size` argument\n",
    "# Since there are `test_size` items for each `adhoc_dimension`\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "def split(obj: np.ndarray, n: int = 20):\n",
    "    quarter = n // 4\n",
    "    half = n // 2\n",
    "    first = np.concatenate((obj[:quarter], obj[half : half + quarter]))\n",
    "    second = np.concatenate((obj[quarter:half], obj[half + quarter :]))\n",
    "    return first, second\n",
    "\n",
    "\n",
    "test_features, predict_features = split(test_features)\n",
    "test_labels, predict_labels = split(test_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3aa6dafc-6d0b-417e-85c4-749f1452063e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:33.089612Z",
     "iopub.status.busy": "2024-05-07T14:52:33.089436Z",
     "iopub.status.idle": "2024-05-07T14:52:33.803180Z",
     "shell.execute_reply": "2024-05-07T14:52:33.802403Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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XcOXX36J7OxsyzaNRoPBgwdjd40q7ZoMBgMMBoPl9sWLFwEA5eXlDYm3bkyQr0BLr9fbvV8Y7Q95s/d4R491V83nlvM1sve8gLzn6ej6+AtPXj9339NqUfs81Pw9IOdzu8Pd16yhsVV/93MitMAiCReu+M8//4ybbroJn3/+OW6//XbL9r/+9a/YuXMn9uzZU+cxc+bMwdy5cz0TLRER+YVTp06hVatWSodBXiL7aJTs7GxMnz7dcvvChQto27YtTp48icjISLmfXhX0ej1at26NU6dOISIiQulwvILnHBjnDATmefOcG37OQgiUl5ejZcuWHoyO1M6lZKN58+bQarX45ZdfrLb/8ssviIuLs/kYnU4HnU5XZ3tkZGTAfEirRURE8JwDQCCeMxCY581zbphA+Y8m3eBSgWhwcDC6d++O//3vf5ZtJpMJ//vf/6y6VYiIiIiqudyNMn36dEyYMAE9evRAr1698NJLL+Hy5cuYNGmSHPERERGRj3M52bj//vtx5swZPPXUUygrK0Nqaio2bdqEFi1aOPV4nU6Hp59+2mbXir/iOQeGQDxnIDDPm+dM5BqXRqMQERERuYoLsREREZGsmGwQERGRrJhsEBERkayYbBAREZGsvJpsvPLKK0hISEBISAh69+6NvXv3evPpve6TTz7BiBEj0LJlS0iShLy8PKVDkl1ubi569uyJJk2aIDY2FpmZmfjuu++UDktWS5YsQZcuXSyTHd1+++346KOPlA7Lq5555hlIkoRp06YpHYqs5syZA0mSrH46deqkdFiy++mnnzB+/Hg0a9YMoaGhuPXWW7F//36lwyIf4rVkIxCXpr98+TK6du2KV155RelQvGbnzp2YMmUKvvjiC2zduhXXr1/H3XffjcuXLysdmmxatWqFZ555Bl9++SX279+PO++8E6NGjcI333yjdGhesW/fPrz++uvo0qWL0qF4xS233ILS0lLLz2effaZ0SLI6f/48+vbti0aNGuGjjz7C4cOHsWjRIkRFRSkdGvkS4SW9evUSU6ZMsdw2Go2iZcuWIjc311shKAqAWL9+vdJheN3p06cFALFz506lQ/GqqKgo8dZbbykdhuzKy8tFUlKS2Lp1qxgwYID485//rHRIsnr66adF165dlQ7Dq5588klxxx13KB0G+TivtGxUL00/ePBgyzZHS9OTf7h48SIAIDo6WuFIvMNoNGL16tW4fPlyQEzhP2XKFAwfPtzqs+3vSkpK0LJlS9x8880YN24cTp48qXRIstq4cSN69OiB++67D7GxsejWrRvefPNNpcMiH+OVZOPs2bMwGo11Zhlt0aIFysrKvBECKcBkMmHatGno27cvUlJSlA5HVl9//TXCw8Oh0+nwxz/+EevXr0fnzp2VDktWq1evxoEDB5Cbm6t0KF7Tu3dvLF++HJs2bcKSJUtw7Ngx9OvXD+Xl5UqHJpsffvgBS5YsQVJSEjZv3oxHH30UU6dOxTvvvKN0aORDZF9ingLXlClTUFRU5Pd92gDQsWNHFBYW4uLFi1i7di0mTJiAnTt3+m3CcerUKfz5z3/G1q1bERISonQ4XjNs2DDL7126dEHv3r3Rtm1brFmzBg8//LCCkcnHZDKhR48eWLhwIQCgW7duKCoqwmuvvYYJEyYoHB35Cq+0bDRkaXrybY899hjy8/Px8ccfo1WrVkqHI7vg4GAkJiaie/fuyM3NRdeuXbF48WKlw5LNl19+idOnT+O2225DUFAQgoKCsHPnTvzzn/9EUFAQjEaj0iF6RdOmTdGhQwccPXpU6VBkEx8fXydpTk5O9vvuI/IsryQbXJo+cAgh8Nhjj2H9+vXYvn072rVrp3RIijCZTDAYDEqHIZu77roLX3/9NQoLCy0/PXr0wLhx41BYWAitVqt0iF5x6dIlfP/994iPj1c6FNn07du3zvD1I0eOoG3btgpFRL7Ia90ogbg0/aVLl6z+x3Ps2DEUFhYiOjoabdq0UTAy+UyZMgWrVq3Chg0b0KRJE0tNTmRkJEJDQxWOTh7Z2dkYNmwY2rRpg/LycqxatQo7duzA5s2blQ5NNk2aNKlTh9O4cWM0a9bMr+tzZs6ciREjRqBt27b4+eef8fTTT0Or1WLs2LFKhyabJ554An369MHChQuRlZWFvXv34o033sAbb7yhdGjkS7w59OXll18Wbdq0EcHBwaJXr17iiy++8ObTe93HH38sANT5mTBhgtKhycbW+QIQy5YtUzo02Tz00EOibdu2Ijg4WMTExIi77rpLbNmyRemwvC4Qhr7ef//9Ij4+XgQHB4ubbrpJ3H///eLo0aNKhyW7Dz/8UKSkpAidTic6deok3njjDaVDIh/DJeaJiIhIVlwbhYiIiGTFZIOIiIhkxWSDiIiIZMVkg4iIiGTFZIOIiIhkxWSDiIiIZMVkg4iIiGTFZIOIiIhkxWSDiIiIZMVkg4iIiGTFZIOIiIhkxWSDiIiIZPX/gILAsxoo1XIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot data\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "plt.figure(figsize=(5, 5))\n",
    "plt.ylim(0, 2 * np.pi)\n",
    "plt.xlim(0, 2 * np.pi)\n",
    "plt.imshow(\n",
    "    np.asmatrix(adhoc_total).T,\n",
    "    interpolation=\"nearest\",\n",
    "    origin=\"lower\",\n",
    "    cmap=\"RdBu\",\n",
    "    extent=[0, 2 * np.pi, 0, 2 * np.pi],\n",
    ")\n",
    "\n",
    "plt.scatter(\n",
    "    train_features[np.where(train_labels[:] == 0), 0],\n",
    "    train_features[np.where(train_labels[:] == 0), 1],\n",
    "    marker=\"s\",\n",
    "    facecolors=\"w\",\n",
    "    edgecolors=\"b\",\n",
    "    label=\"A train\",\n",
    ")\n",
    "plt.scatter(\n",
    "    train_features[np.where(train_labels[:] == 1), 0],\n",
    "    train_features[np.where(train_labels[:] == 1), 1],\n",
    "    marker=\"o\",\n",
    "    facecolors=\"w\",\n",
    "    edgecolors=\"r\",\n",
    "    label=\"B train\",\n",
    ")\n",
    "plt.scatter(\n",
    "    test_features[np.where(test_labels[:] == 0), 0],\n",
    "    test_features[np.where(test_labels[:] == 0), 1],\n",
    "    marker=\"s\",\n",
    "    facecolors=\"b\",\n",
    "    edgecolors=\"w\",\n",
    "    label=\"A test\",\n",
    ")\n",
    "plt.scatter(\n",
    "    test_features[np.where(test_labels[:] == 1), 0],\n",
    "    test_features[np.where(test_labels[:] == 1), 1],\n",
    "    marker=\"o\",\n",
    "    facecolors=\"r\",\n",
    "    edgecolors=\"w\",\n",
    "    label=\"B test\",\n",
    ")\n",
    "\n",
    "plt.legend(bbox_to_anchor=(1.05, 1), loc=\"upper left\", borderaxespad=0.0)\n",
    "plt.title(\"Ad hoc dataset for classification\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb2bfd25-a628-4c12-ab39-9007c2510303",
   "metadata": {},
   "source": [
    "### Initializing Classiq's QSVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9fe3ac22-9c3c-40fb-a482-25e448a0e042",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:33.808503Z",
     "iopub.status.busy": "2024-05-07T14:52:33.807145Z",
     "iopub.status.idle": "2024-05-07T14:52:36.356130Z",
     "shell.execute_reply": "2024-05-07T14:52:36.355502Z"
    }
   },
   "outputs": [],
   "source": [
    "## Classiq imports\n",
    "\n",
    "from classiq import Pauli, construct_qsvm_model, execute, show, synthesize\n",
    "from classiq.applications.qsvm import QSVMFeatureMapEntanglement\n",
    "\n",
    "pauli_z_zz_feature_map_function_name = \"pauli_feature_map\"\n",
    "pauli_z_zz_kwargs = {\n",
    "    \"paulis\": [[Pauli.Z], [Pauli.Z, Pauli.Z]],\n",
    "    \"entanglement\": QSVMFeatureMapEntanglement.CIRCULAR,\n",
    "    \"alpha\": 2,\n",
    "    \"reps\": 2,\n",
    "    \"feature_dimension\": 2,\n",
    "}\n",
    "\n",
    "\n",
    "QSVM_PAULI_Z_ZZ = construct_qsvm_model(\n",
    "    train_data=train_features.tolist(),\n",
    "    train_labels=train_labels.tolist(),\n",
    "    test_data=test_features.tolist(),\n",
    "    test_labels=test_labels.tolist(),\n",
    "    predict_data=predict_features.tolist(),\n",
    "    feature_map_function_name=pauli_z_zz_feature_map_function_name,\n",
    "    **pauli_z_zz_kwargs\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "38840c3c-e84e-4875-84b4-4bf287646368",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:36.359424Z",
     "iopub.status.busy": "2024-05-07T14:52:36.358559Z",
     "iopub.status.idle": "2024-05-07T14:52:36.364627Z",
     "shell.execute_reply": "2024-05-07T14:52:36.364030Z"
    }
   },
   "outputs": [],
   "source": [
    "from classiq import write_qmod\n",
    "\n",
    "write_qmod(QSVM_PAULI_Z_ZZ, \"qsvm_pauli_feature_map\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a64951ce-fc0d-4064-ad95-c24e224a4cc7",
   "metadata": {},
   "source": [
    "### Viewing the model's parameterized quantum circuit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9b24240a-0da3-4fb1-9edb-df5f1a276a49",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:36.367335Z",
     "iopub.status.busy": "2024-05-07T14:52:36.366871Z",
     "iopub.status.idle": "2024-05-07T14:52:37.729984Z",
     "shell.execute_reply": "2024-05-07T14:52:37.729268Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Opening: https://platform.classiq.io/circuit/b0c1d662-232b-4da0-a082-896f6a83c290?version=0.41.0.dev39%2B79c8fd0855\n"
     ]
    }
   ],
   "source": [
    "qprog = synthesize(QSVM_PAULI_Z_ZZ)\n",
    "show(qprog)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c4928cd-0fc7-4f50-b187-aa0baaf144af",
   "metadata": {},
   "source": [
    "### Executing:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a5dca615-06d0-4890-9eae-3cfb5f4ca953",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:37.734110Z",
     "iopub.status.busy": "2024-05-07T14:52:37.732978Z",
     "iopub.status.idle": "2024-05-07T14:52:51.360536Z",
     "shell.execute_reply": "2024-05-07T14:52:51.359907Z"
    }
   },
   "outputs": [],
   "source": [
    "results = execute(qprog).result()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b468324e-f3b2-4568-bd1c-25672f3345c0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-05-07T14:52:51.363349Z",
     "iopub.status.busy": "2024-05-07T14:52:51.362902Z",
     "iopub.status.idle": "2024-05-07T14:52:51.367561Z",
     "shell.execute_reply": "2024-05-07T14:52:51.366895Z"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing success ratio: 1.0\n",
      "\n",
      "Prediction from datapoints set:\n",
      "  ground truth: [0 0 0 0 0 1 1 1 1 1]\n",
      "  prediction:   [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]\n",
      "  success rate: 100.0%\n"
     ]
    }
   ],
   "source": [
    "# Printing tests result\n",
    "print(f\"Testing success ratio: {results[0].value['test_score']}\")\n",
    "print()\n",
    "# Printing predictions\n",
    "print(\"Prediction from datapoints set:\")\n",
    "print(f\"  ground truth: {predict_labels}\")\n",
    "predicted_labels = results[0].value[\"predicted_labels\"]\n",
    "print(f\"  prediction:   {predicted_labels}\")\n",
    "print(\n",
    "    f\"  success rate: {100 * np.count_nonzero(predicted_labels == predict_labels) / len(predicted_labels)}%\"\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  },
  "vscode": {
   "interpreter": {
    "hash": "a07aacdcc8a415e7643a2bc993226848ff70704ebef014f87460de9126b773d0"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
